#include "test_byte.h"
#include "string.h"
#include "stdlib.h"

#include "esp_timer.h"
#include "esp_log.h"
#include "esp_sleep.h"

#include "driver/gpio.h"



static int lua_test_obj(lua_State *L){
    
    gpio_config_t*conf=(gpio_config_t*)lua_touserdata(L,1);
    if(conf==NULL){
        printf("error ...\r\n");
    }else{
        printf("ok  %d ...\r\n",conf->mode);
    }
    return 0;
}



static int lua_create_new_student(lua_State *L){
     //创建一个对象指针放到stack里，返回给Lua中使用，userdata的位置-1
    gpio_config_t*conf = (gpio_config_t*)lua_newuserdata(L, sizeof(gpio_config_t));
    //Lua->stack，得到全局元表位置-1,userdata位置-2
    luaL_getmetatable(L, "stu");
    //将元表赋值给位置-2的userdata，并弹出-1的元表
    lua_setmetatable(L, -2);
    return 1;
}

static const luaL_Reg testFunc[] ={
    {"testObj", lua_test_obj},
	{NULL, NULL}
};

static const luaL_Reg lua_reg_student_constructor_funcs[] = {
    { "create", lua_create_new_student },
    { NULL, NULL }
};

int luaopen_student_libs (lua_State *L) {
     //创建全局元表（里面包含了对LUA_REGISTRYINDEX的操作），元表的位置为-1
    luaL_newmetatable(L, "stu");

    //将元表作为一个副本压栈到位置-1，原元表位置-2
    lua_pushvalue(L, -1);

    //设置-2位置元表的__index索引的值为位置-1的元表，并弹出位置-1的元表，原元表的位置为-1
    lua_setfield(L, -2, "__index");

    //将成员函数注册到元表中（到这里，全局元表的设置就全部完成了）
    luaL_setfuncs(L, testFunc, 0);

    //注册构造函数到新表中，并返回给Lua
    luaL_newlib(L, lua_reg_student_constructor_funcs);
    return 1;
}